package com.itbaizhan.shopping_goods_service.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itbaizhan.shopping_common.pojo.ProductType;
import com.itbaizhan.shopping_common.result.BusException;
import com.itbaizhan.shopping_common.result.CodeEnum;
import com.itbaizhan.shopping_common.service.ProductTypeService;
import com.itbaizhan.shopping_goods_service.mapper.ProductTypeMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 商品类型服务实现类
 */
@DubboService
@Transactional
@Service
public class ProductTypeServiceImpl implements ProductTypeService {
	
	@Autowired
	private ProductTypeMapper productTypeMapper;
	
	/**
	 * 添加商品类型
	 *只会传入父类型id，所以需要根据该id设置并添加级别
	 * @param productType
	 */
	public void add(ProductType productType) {
	
		// 根据父类型id查询父类型
		ProductType productTypeParent = productTypeMapper.selectById(productType.getParentId());
		// 如果父类型id为0，则表示为第一级类型，来设置当前类型级别
		if (productTypeParent == null){ // 如果没有父类型，则为1级类型
			productType.setLevel(1);
		}else if (productTypeParent.getLevel() < 3) { // 如果父类型级<3 则级别为父级别+1
			productType.setLevel(productTypeParent.getLevel() + 1);
		}else if (productTypeParent.getLevel() == 3){ // 如果父类型级=3 则不能添加子级别
			throw new BusException(CodeEnum.INSERT_PRODUCT_TYPE_ERROR);
		}
		
		productTypeMapper.insert(productType);
	}
	
	/**
	 * 修改商品类型
	 *与添加商品类型一样，需要根据父类型id设置级别
	 * @param productType
	 */
	public void update(ProductType productType) {
		// 根据父类型id查询父类型
		ProductType productTypeParent = productTypeMapper.selectById(productType.getParentId());
		// 根据父类型的级别，来设置当前类型的级别
		if (productTypeParent == null){ // 如果没有父类型，则为1级类型
			productType.setLevel(1);
		} else if (productTypeParent.getLevel() < 3) { // 如果父类型级<3 则级别为父级别+1
			productType.setLevel(productTypeParent.getLevel() + 1);
		} else if (productTypeParent.getLevel() == 3){ // 如果父类型级=3 则不能添加子级别
			throw new BusException(CodeEnum.INSERT_PRODUCT_TYPE_ERROR);
		}
		
		productTypeMapper.updateById(productType);
	}
	
	/**
	 * 删除商品类型
	 *该商品类型id可能作为其他商品的父类型，所以需要判断该类型是否存在子类型
	 * @param id
	 */
	public void delete(Long id) {
		// 查询该类型的子类型
		QueryWrapper<ProductType> queryWrapper = new QueryWrapper();
		queryWrapper.eq("parentId",id);
		List<ProductType> productTypes = productTypeMapper.selectList(queryWrapper);
		// 如果该类型有子类型，删除失败
		if (!CollectionUtils.isEmpty(productTypes)){
			throw new BusException(CodeEnum.DELETE_PRODUCT_TYPE_ERROR);
		}
		productTypeMapper.deleteById(id);
		
	}
	
	/**
	 * 根据id查询商品类型
	 *
	 * @param id
	 * @return
	 */
	public ProductType findById(Long id) {
		return productTypeMapper.selectById(id);
	}
	
	/**
	 * 分页查询商品类型
	 *
	 * @param productType
	 * @param page
	 * @param size
	 * @return
	 */
	public Page<ProductType> search(ProductType productType, int page, int size) {
		QueryWrapper<ProductType> wrapper = new QueryWrapper<>();
		if (productType != null ) {
			if (productType.getName() != null && !productType.getName().equals("")) {
				wrapper.like("name", productType.getName());
			}
			// 上级类型id不为空时
			if (productType.getParentId() != null){
				wrapper.eq("parentId",productType.getParentId());
			}
		}
		
		return productTypeMapper.selectPage(new Page<>(page, size), wrapper);
	}
	
	/**
	 * 查询商品类型
	 *
	 * @param productType
	 * @return
	 */
	public List<ProductType> findProductType(ProductType productType) {
		QueryWrapper<ProductType> wrapper = new QueryWrapper<>();
		if (productType != null ) {
			if (productType.getName() != null && !productType.getName().equals("")) {
				wrapper.like("name", productType.getName());
			}
			// 上级类型id不为空时
			if (productType.getParentId() != null){
				wrapper.eq("parentId",productType.getParentId());
			}
		}
		return productTypeMapper.selectList(wrapper);
	}
}
